home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1995 October
/
EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso
/
Aminet
/
util
/
shell
/
cfn.lha
/
cfn
/
cfn.e
< prev
next >
Wrap
Text File
|
1995-05-05
|
8KB
|
346 lines
/* Window shuffle! */
/* Tar det bakersta fönstret, aktiverar det och flyttar det längst fram när man
trycker rätt tangent (vänster amiga tab). */
/* Implementerar också filename completion med tab */
/* Tar första match, nästa tryckning tar nästa match osv.. */
/* Kompilerar EJ med E v2.1b, words signextendas inte i den versionen */
OPT STACK=$CDAB /* Så att den känns igen med NewZap */
/* lagom storlek $0800 (2048) bytes */
CONST FBUF=80
MODULE 'keymap'
MODULE 'utility'
MODULE 'exec/ports'
MODULE 'exec/tasks'
MODULE 'exec/types'
MODULE 'exec/interrupts'
MODULE 'exec/nodes'
MODULE 'exec/io'
MODULE 'exec/memory'
MODULE 'intuition/screens'
MODULE 'intuition/intuition'
MODULE 'devices/input'
MODULE 'devices/inputevent'
MODULE 'dos/dos'
MODULE 'dos/dosextens'
OBJECT memess /* från Notify */
mess : mn
wind : LONG
process : LONG
ENDOBJECT
OBJECT toraw
cd : CHAR
qu : CHAR
ENDOBJECT
DEF fib:PTR TO fileinfoblock /* global så att värdena sparas */
DEF old_lock,path_lock,todel
DEF glob_event:inputevent
DEF bb[81]:ARRAY,bbp
DEF lastproc:PTR TO process,lastwin,okwin,flag,
wins[10]:ARRAY OF LONG,procs[10]:ARRAY OF LONG
DEF task:PTR TO tc
DEF sig
DEF bufw:PTR TO inputevent, buf[5]:ARRAY OF inputevent, bufr:PTR TO inputevent
DEF bufend
DEF port:PTR TO mp
DEF io_req:PTR TO iostd
PROC main()
DEF handler:is
DEF lnpek:PTR TO ln,t,s
bufr:=buf; bufw:=buf; bufend:=5*SIZEOF inputevent + buf
FOR t:=0 TO 4 DO buf[t].class:=IECLASS_RAWKEY
IF (fib := New(SIZEOF fileinfoblock)) = 0 THEN CleanUp(20)
IF openlibs() THEN CleanUp(20)
sig:=Shl(1,(s:=AllocSignal(-1)))
task:=FindTask(NIL)
SetTaskPri(task,5)
IF (port:=CreateMsgPort())
lnpek:=port.ln
lnpek.name:='Shuffle'
AddPort(port)
IF (io_req:=CreateIORequest(port,SIZEOF iostd))
IF OpenDevice('input.device',0,io_req,0) = NIL
handler.code:={handeven}
MOVE.L A4,t
handler.data:=t
lnpek:=handler.ln
lnpek.pri:=51; /* just before intuition */
lnpek.name:='Shuffle';
io_req.data:=handler;
io_req.command:=IND_ADDHANDLER;
DoIO(io_req);
serve_handler(); /* never returns... */
io_req.data:=handler;
io_req.command:=IND_REMHANDLER;
DoIO(io_req);
/* ELSE
WriteF('No input.device') */
ENDIF
DeleteIORequest(io_req)
/* ELSE
WriteF('No CreateIORequest') */
ENDIF
RemPort(port)
DeleteMsgPort(port)
/* ELSE
WriteF('No CreateMsgPort') */
ENDIF
FreeSignal(s)
IF utilitybase THEN CloseLibrary(utilitybase)
IF keymapbase THEN CloseLibrary(keymapbase)
ENDPROC
PROC observe_input() /* Har hittat RawKey */
DEF i
IF Long(intuitionbase+52)<>lastwin /* bytt fönster */
bbp:=0
lastwin:=Long(intuitionbase+52)
i:=0
WHILE (i<10) AND (lastwin<>wins[i]) DO INC i
IF i<10
lastproc:=procs[i]
okwin:=TRUE
ELSE
lastproc:=NIL; okwin:=FALSE; flag := TRUE
ENDIF
ENDIF
IF (glob_event.code = $42) AND (glob_event.qualifier = $ffff8040) /* Amiga-TAB */
glob_event.class := IECLASS_NULL
MOVE.L bufw,A1
MOVE.L glob_event,A0
MOVE.L 6(A0),6(A1)
MOVE.L 10(A0),10(A1)
ADDI.L #SIZEOF inputevent,bufw
IF bufw=bufend THEN bufw:=buf
Signal(task,sig)
RETURN
ENDIF
IF okwin
IF glob_event.code = $42
glob_event.class := IECLASS_NULL
okwin:=FALSE /* ta inte emot fler tecken innan sökningen färdig */
ENDIF
MOVE.L bufw,A1
MOVE.L glob_event,A0
MOVE.L 6(A0),6(A1)
MOVE.L 10(A0),10(A1)
ADDI.L #SIZEOF inputevent,bufw
IF bufw=bufend THEN bufw:=buf
Signal(task,sig)
RETURN
ENDIF
RETURN
handeven:
MOVE.L A0,-(A7) /* Spara pekare InputEvent */
notrawkey:
MOVE.L A0,D0 /* Slut ? */
BEQ.S nomore
CMPI.B #IECLASS_RAWKEY,4(A0) /* Bara RAWKEY intress. */
BEQ.S rawkey
MOVE.L (A0),A0 /* Kolla nästa */
BRA.S notrawkey
rawkey:
MOVEM.L D1-D7/A0-A6,-(A7) /* Fixa register inför proc. */
MOVE.L A1,A4 /* ladda A4 */
MOVE.L A0,glob_event
observe_input() /* E-funktion */
MOVEM.L (A7)+,D1-D7/A0-A6 /* Hämta register */
MOVE.L (A0),A0
BRA.S notrawkey
nomore:
MOVE.L (A7)+,D0 /* Avsluta */
RTS
ENDPROC
PROC clearit() /* ta bort gamla lock */
IF old_lock
bbp := StrLen(bb)
CurrentDir(old_lock)
IF path_lock THEN UnLock(path_lock)
old_lock := NIL
ENDIF
flag := NIL
ENDPROC
PROC serve_handler()
DEF lock,win1:PTR TO window,win2:PTR TO window,s:PTR TO screen,ms:PTR TO memess,t
DEF t2
bbp:=0
LOOP
IF (Wait(Shl(1,port.sigbit)+sig+SIGBREAKF_CTRL_C) AND SIGBREAKF_CTRL_C) THEN RETURN
WHILE ms:=GetMsg(port) /* Nytt fönster */
addwin(ms.wind,ms.process)
FreeMem(ms,SIZEOF memess)
ENDWHILE
WHILE bufr<>bufw
t:=bufr.code
t2 := ((t AND $7f) <> $42)
IF t2 OR flag
clearit()
ENDIF
SELECT t
CASE $42
IF bufr.qualifier=$ffff8040 /* Amiga-tab, skyffla fönster */
lock:=LockIBase(0)
win1:=Long(intuitionbase+52)
win2:=win1.nextwindow
IF win2 = NIL
s:=win1.wscreen
win2:=s.firstwindow
ENDIF
IF (win1<>0) AND (win2<>0)
WindowToFront(win2)
ActivateWindow(win2)
ENDIF
UnlockIBase(lock)
ELSE /* Här ska filnamnet kompletteras */
IF lastproc
todel := IF old_lock THEN StrLen(bb)-bbp ELSE 0
PutChar(bbp+bb,0)
IF old_lock
complete()
ELSE
old_lock:=CurrentDir(lastproc.currentdir)
t:=FilePart(bb)
t2:=Char(t)
PutChar(t,0)
IF (path_lock:=Lock(bb,ACCESS_READ))
PutChar(t,t2)
IF Examine(path_lock,fib)
complete()
ENDIF
ELSE
clearit()
ENDIF
ENDIF
feedit()
Delay(2) /* Vänta på att inputströmmen är slut */
okwin:=TRUE
ENDIF
ENDIF
CASE $41 /* BS */
IF bbp>0 THEN DEC bbp
CASE $44 /* RETURN */
bbp:=0
CASE $4c /* Arrow Up */
bbp:=0
CASE $4d /* Arrow Down */
bbp:=0
CASE $4e /* Arrow Right */
bbp:=0
CASE $4f /* Arrow Left */
bbp:=0
CASE $40 /* Space */
bbp:=0
CASE $32 /* CTRL-x */
IF bufr.qualifier = $ffff8008
bbp:=0
ELSE
bbp:=bbp+MapRawKey(bufr,bb+bbp,FBUF-bbp,NIL)
ENDIF
DEFAULT
bbp:=bbp+MapRawKey(bufr,bb+bbp,FBUF-bbp,NIL)
IF (bbp=1) AND ((Char(bb)="<") OR (Char(bb)=">")) THEN bbp:=0
ENDSELECT
bufr:=bufr+SIZEOF inputevent
IF bufr=bufend THEN bufr:=buf
ENDWHILE
ENDLOOP
ENDPROC
PROC addwin(wind:PTR TO window,process)
DEF lock,s:PTR TO screen,i=0,w:PTR TO window
lock:=LockIBase(0)
s:=wind.wscreen
w:=s.firstwindow
WHILE i<10 AND w<>NIL
IF wind=wins[i]
procs[i]:=process
i:=10
ENDIF
IF w=wins[i]
w:=s.firstwindow
i:=i+1
ELSE
w:=w.nextwindow
ENDIF
ENDWHILE
IF i<10
wins[i]:=wind
procs[i]:=process
lastwin:=NIL
ENDIF
UnlockIBase(lock)
ENDPROC
PROC openlibs()
IF (utilitybase:=OpenLibrary('utility.library',37))
IF ((keymapbase:=OpenLibrary('keymap.library',37))=NIL) THEN CloseLibrary(utilitybase)
ENDIF
RETURN (utilitybase=NIL)+(keymapbase=NIL)
ENDPROC
PROC complete()
DEF comset,t,fnam,flen
fnam:=FilePart(bb); flen:=StrLen(fnam);
LowerStr(fnam)
REPEAT
t:=ExNext(path_lock,fib)
LowerStr(fib.filename)
IF fib.direntrytype>0 THEN copstr('/',fib.filename+StrLen(fib.filename))
comset := StrCmp(fnam,fib.filename,flen)
UNTIL (t=0) OR comset
IF t AND comset AND ((fnam-bb+StrLen(fib.filename)) < 80)
copstr(fib.filename,fnam)
ELSE
DisplayBeep(NIL)
clearit()
ENDIF
ENDPROC
PROC copstr(str1,str2)
MOVE.L str1,A0
MOVE.L str2,A1
copstr_l1:
MOVE.B (A0)+,(A1)+
BNE.S copstr_l1
ENDPROC
PROC feedit()
DEF raw_char:toraw,iep:inputevent,i=0
iep.nextevent:=NIL
PutLong(iep+10,0)
iep.class:=IECLASS_RAWKEY
io_req.data:=iep
io_req.length:=SIZEOF inputevent
io_req.command:=IND_WRITEEVENT
WHILE todel
DEC todel
iep.code := $41
iep.qualifier := $ffff8000
DoIO(io_req)
ENDWHILE
WHILE Char(bb+bbp+i)
MapANSI(bb+bbp+i,1,raw_char,1,NIL)
iep.code:=raw_char.cd
iep.qualifier:=raw_char.qu
DoIO(io_req)
INC i
ENDWHILE
ENDPROC